﻿using System;

namespace Encapsulation
{
    /*
     封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中，封装是为了防止对实现细节的访问。
     抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化，封装则使开发者实现所需级别的抽象。=
     C# 封装根据具体的需要，设置使用者的访问权限，并通过 访问修饰符 来实现。
     一个 访问修饰符 定义了一个类成员的范围和可见性。
        权限修饰符(从大到小):
            public                  所有对象都可以访问
            protected internal      访问限于当前程序集或派生自包含类的类型
            internal                同一个程序集的对象可以访问
            protected               只有该类对象及其子类对象可以访问
            private                 对象本身在对象内部可以访问
     默认: 类 internal 方法 private
     */

    // Public 访问修饰符允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问。
    class PublicTest
    {
        public double length;
        public double width;

        public double GetArea()
        {
            return length * width;
        }

        public void Display()
        {
            Console.WriteLine("长度: {0}", length);
            Console.WriteLine("宽度: {0}", width);
            Console.WriteLine("面积: {0}", GetArea());
        }
    }

    // Private 访问修饰符允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。
    class PrivateTest
    {
        private double length;
        private double width;

        public void AcceptDetails()
        {
            Console.WriteLine("请输入长度: ");
            length = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("请输入宽度: ");
            width = Convert.ToDouble(Console.ReadLine());
        }

        public double GetArea()
        {
            return length * width;
        }

        public void Display()
        {
            Console.WriteLine("长度: {0}", length);
            Console.WriteLine("宽度: {0}", width);
            Console.WriteLine("面积: {0}", GetArea());
        }
    }

    // Internal 访问修饰符允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。
    // 换句话说，带有 internal 访问修饰符的任何成员可以被定义在该成员所定义的应用程序内的任何类或方法访问。
    class InternalTest
    {
        internal double length;
        internal double width;

        double GetArea()
        {
            return length * width;
        }

        public void Display()
        {
            Console.WriteLine("长度: {0}", length);
            Console.WriteLine("宽度: {0}", width);
            Console.WriteLine("面积: {0}", GetArea());
        }
    }

    class ExecuteExcapsulation
    {
    }
}